import request from '@/utils/request'
import {ApiResponse,PageData,PageQuery,SelectOption} from "@/ts/CommonTypes"
import {downloadZip} from "@/api/ApiUtils";
import {RoleQuery} from "./AuthRoleApi";

const urlPrefix = "/api/codeGenerator/";

export class TableColumnVO {
    /**
     * 字段名
     */
    name: string = '';

    /**
     * 数据类型
     */
    type: string = '';

    /**
     * 注释
     */
    comment: string = '';

    /**
     * 是不是主键
     */
    isKey: boolean = false;

    /**
     * 是不是索引
     */
    isIndex: boolean = false;

    /**
     * 对应的Java属性名
     */
    javaName: string = '';

    /**
     * 必填字段
     */
    required: boolean = false;

    /**
     * 对应的Java类型
     */
    javaType: string = '';

    /**
     * 对应的ts数据类型
     */
    tsType: string = '';

    /**
     * 是否是表格中的列
     */
    isTableColumn: boolean = true;

    /**
     * 在表格中展示的标题
     */
    columnTitle: string = '';

    /**
     * 是否是表单字段
     */
    isFormData: boolean = true;

    /**
     * 表单是否必填
     */
    formNotNull: boolean = false;

    constructor(init?: Partial<TableColumnVO>) {
        if (init) {
            Object.assign(this, init);
        }
    }
}


export class TemplateVO {

    /**
     * 包名（模块名）
     */
    packageName: string = '';

    /**
     * 实体类名
     */
    entityName: string = '';

    /**
     * 表名
     */
    tableName: string = '';

    /**
     * 表注释
     */
    tableComment: string = '';

    /**
     * 字段列表
     */
    list: TableColumnVO[] = [];


    /**
     * 作者名
     */
    author: string = '';


    /**
     * 实例名
     */
    instanceName: string = '';


    menuName: string
    parentMenuId:number;
    iconName: string;

    //要生成的内容
    generatorItems:string[] =[];

    userTempPath:string;

    /**
     * 计算出的查询条件页面布局的span值  6、8、12、24
     */
    querySpan: number | null = null;
    constructor(init?: Partial<TemplateVO>) {
        if (init) {
            Object.assign(this, init);
        }
    }
}
export class RunLog {
    title: string;
    description: string;
    constructor(init?: Partial<RunLog>) {
        if (init) {
            Object.assign(this, init);
        }
    }
}

export class CodeContentVO {
    javaFiles:FileVO[];
    vueFiles:FileVO[];
    sqlFiles:FileVO[];
    logs: RunLog[];

    constructor(init?: Partial<CodeContentVO>) {
        if (init) {
            Object.assign(this, init);
        }
    }
}

export class FileVO{
    title:string;
    fileName:string;
    filePath:string;
    projectPath:string;
    content:string;
    fileType:string;
    markdownContent:string;
    constructor(init?: Partial<FileVO>) {
        if (init) {
            Object.assign(this, init);
        }
    }
}


export function getAllTables() {
    return request<ApiResponse<SelectOption[]>>({
        url:  urlPrefix + 'getAllTables' ,
        method: 'GET'
    })
}
export function getColumnList(tableName:string) {
    return request<ApiResponse<TemplateVO>>({
        url:  urlPrefix + 'getColumnList?tableName='+tableName ,
        method: 'GET'
    })
}

export function generator(vo: TemplateVO){
    return request<ApiResponse<CodeContentVO>>({
        url: urlPrefix + 'generator',
        method: 'POST',
        data: vo,
    })
}


export function download(tempPath:string) {
    request.get(urlPrefix + 'downloadZip?tempPath='+ tempPath, { responseType: "blob" })
        .then((res: Blob) => {
            downloadZip(res, "test.zip")
        })
        .catch(error => {
            console.error("导出失败:", error)
        })
}